package com.study.springbootsecurity.util;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

/**
 * @Description: TODO
 * @author: Huangjianyun
 * @date: 2025-06-08 2:19
 */

public class PasswordUtils {

    // BCrypt加密工具实例，可设置加密强度（默认为10）
    private static final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(12);

    /**
     * 加密明文密码
     * @param rawPassword 明文密码
     * @return 加密后的密码（包含盐值和算法信息）
     */
    public static String encrypt(String rawPassword) {
        return passwordEncoder.encode(rawPassword);
    }

    /**
     * 验证密码是否匹配
     * @param rawPassword 明文密码
     * @param encodedPassword 加密后的密码
     * @return 密码是否匹配
     */
    public static boolean matches(String rawPassword, String encodedPassword) {
        return passwordEncoder.matches(rawPassword, encodedPassword);
    }

    /**
     * 比较两个加密后的密码是否相同
     * 注意：由于BCrypt的特性，相同明文生成的哈希值也不同，因此不能直接比较哈希值
     * 此方法实际比较的是明文密码是否相同
     * @param rawPassword1 第一个明文密码
     * @param encodedPassword2 第二个加密后的密码
     * @return 两个明文密码是否相同
     */
    public static boolean compareEncryptedPasswords(String rawPassword1, String encodedPassword2) {
        return matches(rawPassword1, encodedPassword2);
    }

    /**
     * 检查密码是否需要重新加密（例如，当加密强度改变时）
     * @param encodedPassword 已加密的密码
     * @return 是否需要重新加密
     */
    public static boolean needsRehash(String encodedPassword) {
        return passwordEncoder.upgradeEncoding(encodedPassword);
    }

    // 示例用法
//    public static void main(String[] args) {
//        String rawPassword = "123456";
//
//        // 加密密码
//        String encryptedPassword = encrypt(rawPassword);
//        System.out.println("加密后的密码: " + encryptedPassword);
//
//        // 验证密码
//        boolean isMatch = matches(rawPassword, encryptedPassword);
//        System.out.println("密码匹配: " + isMatch); // 输出: true
//
//    }
}
